Version:0.9 StartHTML:0000000105 EndHTML:0000018053 StartFragment:0000001499 EndFragment:0000018037
//Sensored BLDC Motor Control Using PIC16F877A
//Used microcontrooler: PIC16F877A @ 12MHz
//Written by: BENCHEROUDA Okba
//http://www.elecnote.blogspot.com
//electronnote@gmail.com
//All rights reserved
//Use at your own risk
unsigned short hall;
unsigned char MoveTable[8] = {0, 33, 6, 36, 24, 9, 18, 0};
unsigned dt, dt0;
void Interrupt(){
if(INTF_bit){ //External Interrupt occurred
INTCON = 0; //Disable all interrupts
PORTB.F2 = 0;
PORTD = 0;
PWM1_Stop();
}
if (TMR1IF_bit){ //Timer1 Interrupt occurred
TMR1IF_bit = 0;
TMR1H = 0x6D;
TMR1L = 0x84;
dt = ADC_Read(0); //Read analog value
if (dt != dt0) {
dt0 = dt;
dt0 = dt0 >> 2;
PWM1_Set_Duty(dt0);
PWM1_Start(); }
}
if (RBIF_bit){ //Pin change Interrupt occurred
RBIF_bit = 0;
hall = PORTB;
hall = hall & 112;
hall = hall >> 4;
PORTD = MoveTable[hall];
}
}
void InitInterrupts(){
OPTION_REG = 0;
T1CON = 0x31;
TMR1IF_bit = 0;
TMR1H = 0x6D;
TMR1L = 0x84;
TMR1IE_bit = 1;
INTCON = 0; //Disable all interrupts
}
void main() {
ADCON1 = 14; // Configure AN0 as analog
CMCON = 7; //Disable comparators
PORTB = 0;
TRISB = 243;
PORTD = 0;
TRISD = 0;
InitInterrupts();
PWM1_Init(10000);
while(1){
while(PORTB.F1); //wait for start key hit
while(!PORTB.F1); // wait till key is released
PORTB.F2 = 1;
hall = PORTB;
hall = hall & 112;
hall = hall >> 4;
PORTD = MoveTable[hall];
INTCON = 0xD8; //Enable all interrupts
PWM1_Start();
}
}